double y,
GtkWidget *image)
{
- return gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
+ return gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image, NULL);
}
static void
GtkDragSource *source;
source = gtk_drag_source_new ();
- content = gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image);
+ content = gdk_content_provider_new_with_callback (GDK_TYPE_TEXTURE, get_texture, image, NULL);
gtk_drag_source_set_content (source, content);
g_object_unref (content);
g_signal_connect (source, "drag-begin", G_CALLBACK (drag_begin), image);
GtkDragSource *source;
source = gtk_drag_source_new ();
- content = gdk_content_provider_new_with_callback (G_TYPE_FILE, get_file, image);
+ content = gdk_content_provider_new_with_callback (G_TYPE_FILE, get_file, image, NULL);
gtk_drag_source_set_content (source, content);
g_object_unref (content);
GType type;
GdkContentProviderGetValueFunc func;
gpointer data;
+ GDestroyNotify notify;
};
struct _GdkContentProviderCallbackClass
return GDK_CONTENT_PROVIDER_CLASS (gdk_content_provider_callback_parent_class)->get_value (provider, value, error);
}
+static void
+gdk_content_provider_callback_dispose (GObject *gobject)
+{
+ GdkContentProviderCallback *self = GDK_CONTENT_PROVIDER_CALLBACK (gobject);
+
+ if (self->notify != NULL)
+ self->notify (self->data);
+
+ self->func = NULL;
+ self->data = NULL;
+ self->notify = NULL;
+
+ G_OBJECT_CLASS (gdk_content_provider_callback_parent_class)->dispose (gobject);
+}
+
static void
gdk_content_provider_callback_class_init (GdkContentProviderCallbackClass *class)
{
GdkContentProviderClass *provider_class = GDK_CONTENT_PROVIDER_CLASS (class);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+ gobject_class->dispose = gdk_content_provider_callback_dispose;
provider_class->ref_formats = gdk_content_provider_callback_ref_formats;
provider_class->get_value = gdk_content_provider_callback_get_value;
}
/**
- * gdk_content_provider_new_for_callback:
+ * gdk_content_provider_new_for_callback: (constructor)
* @type: the type that the callback provides
- * @func: callback to populate a #GValue
+ * @func: (not nullable): callback to populate a #GValue
* @data: (closure): data that gets passed to @func
+ * @notify: a function to be called to free @data when the content provider
+ * goes away
*
* Create a content provider that provides data that is provided via a callback.
*
GdkContentProvider *
gdk_content_provider_new_with_callback (GType type,
GdkContentProviderGetValueFunc func,
- gpointer data)
+ gpointer data,
+ GDestroyNotify notify)
{
GdkContentProviderCallback *content;
+ g_return_val_if_fail (func != NULL, NULL);
+
content = g_object_new (GDK_TYPE_CONTENT_PROVIDER_CALLBACK, NULL);
content->type = type;
content->func = func;
content->data = data;
+ content->notify = notify;
return GDK_CONTENT_PROVIDER (content);
}
GdkContentFormats *formats;
GdkContentProviderGetBytesFunc func;
gpointer data;
+ GDestroyNotify notify;
};
struct _GdkContentProviderCallback2Class
return g_task_propagate_boolean (G_TASK (result), error);
}
+static void
+gdk_content_provider_callback2_dispose (GObject *gobject)
+{
+ GdkContentProviderCallback2 *self = GDK_CONTENT_PROVIDER_CALLBACK2 (gobject);
+
+ if (self->notify != NULL)
+ self->notify (self->data);
+
+ self->notify = NULL;
+ self->data = NULL;
+ self->func = NULL;
+
+ G_OBJECT_CLASS (gdk_content_provider_callback2_parent_class)->dispose (gobject);
+}
+
static void
gdk_content_provider_callback2_class_init (GdkContentProviderCallback2Class *class)
{
GdkContentProviderClass *provider_class = GDK_CONTENT_PROVIDER_CLASS (class);
+ GObjectClass *gobject_class = G_OBJECT_CLASS (class);
+
+ gobject_class->dispose = gdk_content_provider_callback2_dispose;
provider_class->ref_formats = gdk_content_provider_callback2_ref_formats;
provider_class->write_mime_type_async = gdk_content_provider_callback2_write_mime_type_async;
* gdk_content_provider_new_with_formats:
* @formats: formats to advertise
* @func: callback to populate a #GValue
- * @data: data that gets passed to @func
+ * @data: (closure func): data that gets passed to @func
+ * @notify: a function called to free @data when the content provider
+ * goes away
*
* Create a content provider that provides data that is provided via a callback.
*
GdkContentProvider *
gdk_content_provider_new_with_formats (GdkContentFormats *formats,
GdkContentProviderGetBytesFunc func,
- gpointer data)
+ gpointer data,
+ GDestroyNotify notify)
{
GdkContentProviderCallback2 *content;
content = g_object_new (GDK_TYPE_CONTENT_PROVIDER_CALLBACK2, NULL);
content->formats = gdk_content_formats_union_serialize_mime_types (gdk_content_formats_ref (formats));
content->func = func;
content->data = data;
+ content->notify = notify;
return GDK_CONTENT_PROVIDER (content);
}
GDK_AVAILABLE_IN_ALL
GdkContentProvider * gdk_content_provider_new_with_callback (GType type,
GdkContentProviderGetValueFunc func,
- gpointer data);
+ gpointer data,
+ GDestroyNotify notify);
typedef GBytes * (*GdkContentProviderGetBytesFunc) (const char *mime_type,
gpointer data);
GDK_AVAILABLE_IN_ALL
GdkContentProvider * gdk_content_provider_new_with_formats (GdkContentFormats *formats,
GdkContentProviderGetBytesFunc func,
- gpointer data);
+ gpointer data,
+ GDestroyNotify notify);
G_END_DECLS
gdk_content_formats_unref (targets);
source = gtk_drag_source_new ();
- content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, button);
+ content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, button, NULL);
gtk_drag_source_set_content (source, content);
g_object_unref (content);
g_signal_connect (source, "drag-begin", G_CALLBACK (gtk_color_button_drag_begin), button);
GtkDragSource *source;
source = gtk_drag_source_new ();
- content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, swatch);
+ content = gdk_content_provider_new_with_callback (GDK_TYPE_RGBA, get_rgba_value, swatch, NULL);
gtk_drag_source_set_content (source, content);
g_object_unref (content);
g_signal_connect (source, "drag-begin", G_CALLBACK (gtk_color_swatch_drag_begin), swatch);
{
gtk_widget_add_css_class (GTK_WIDGET (swatch), "dark");
gtk_widget_remove_css_class (GTK_WIDGET (swatch), "light");
-
}
gtk_widget_queue_draw (GTK_WIDGET (swatch));
content = gdk_content_provider_new_with_formats (icon_view->priv->source_formats,
gtk_icon_view_drag_data_get,
- icon_view);
+ icon_view,
+ NULL);
drag = gdk_drag_begin (surface,
device,
icon_view->priv->press_start_x,
icon_view->priv->press_start_y);
- g_object_unref (content);
+ g_object_unref (content);
g_signal_connect (drag, "dnd-finished", G_CALLBACK (gtk_icon_view_dnd_finished_cb), icon_view);
content = gdk_content_provider_new_with_formats (priv->source_targets,
gtk_notebook_drag_data_get,
- widget);
+ widget,
+ NULL);
drag = gdk_drag_begin (surface, device, content, GDK_ACTION_MOVE, priv->drag_begin_x, priv->drag_begin_y);
g_object_unref (content);
content = gdk_content_provider_new_with_formats (sidebar->source_targets,
drag_data_get_callback,
- sidebar);
+ sidebar,
+ NULL);
surface = gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (sidebar)));
device = gtk_gesture_get_device (GTK_GESTURE (gesture));
surface = gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (tree_view)));
device = gtk_gesture_get_device (GTK_GESTURE (tree_view->drag_gesture)),
- content = gdk_content_provider_new_with_formats (di->source_formats, gtk_tree_view_drag_data_get, tree_view);
+ content = gdk_content_provider_new_with_formats (di->source_formats,
+ gtk_tree_view_drag_data_get,
+ tree_view,
+ NULL);
drag = gdk_drag_begin (surface, device, content, di->source_actions, start_x, start_y);
gdk_content_formats_builder_add_gtype (builder, G_TYPE_STRING);
formats = gdk_content_formats_builder_free_to_formats (builder);
- content = gdk_content_provider_new_with_formats (formats, get_data, image);
+ content = gdk_content_provider_new_with_formats (formats, get_data, image, NULL);
source = gtk_drag_source_new ();
gtk_drag_source_set_content (source, content);
gtk_drag_source_set_actions (source, GDK_ACTION_COPY|GDK_ACTION_MOVE|GDK_ACTION_ASK);